#define _CRT_SECURE_NO_WARNINGS 2

#include<iostream>
using namespace std;

#include"BST.h"
//
//class AAAAA {
//protected:
//	int _a = 1;
//};
//
//
//class BBBB :public AAAAA {
//
//private:
//	typedef AAAAA A;
//public:
//	void Print(A a) {
//		cout << "void Print(A a)" << endl;
//	}
//};

void test_BST1() {
	BST<int> root;
	root.insert(4);
	root.insert(7);
	root.insert(9);
	root.insert(-1);
	root.insert(0);

	root.InOrder();
	cout << endl;

	if (root.find(0))
		cout << "find" << endl;
	else
		cout << "not find" << endl;
}

void test_BST2() {
	BST<int> root;
	root.insert(4);
	root.insert(7);
	root.insert(9);
	root.insert(-1);
	root.insert(0);
	root.insert(99);
	root.erase(9);
	root.InOrder();

	root.erase(7);
	root.InOrder();

	root.erase(4);
	root.InOrder();

	root.erase(-1);
	root.InOrder();

	root.erase(0);
	root.InOrder();

	root.erase(99);
	root.InOrder();
}

void test_thinking(int& a) {
	cout << a << endl;
}

template<class T>
class A {
public:
	void push(const T& val) {
		;
	}
};

void test(const int& x) {
	;
}
 
void testFindR() {
	BST<int> root;
	root.insert(1);
	root.insert(2);
	root.insert(5);
	if (root.find(2)) {
		cout << "Find!" << endl;
	}
	else {
		cout << "not Find!" << endl;
	}
}

void testInsertR() {
	BST<int> root;
	root.InsertR(1);
	root.InsertR(3);
	root.InsertR(5);
	root.InOrder();
}

void testEraseR() {
	BST<int> root;
	root.InsertR(5);
	root.InOrder();
	root.insert(7);
	root.InOrder();

	root.InsertR(10);
	root.InOrder();

	root.InsertR(2);
	root.InOrder();

	root.EraseR(7);
	root.InOrder();

	root.EraseR(5);
	root.InOrder();

	root.EraseR(10);
	root.InOrder();
	root.EraseR(2);
}

int main() {
	//testFindR();
	//testInsertR();
	testEraseR();
	return 0;
}
 

//
//int main() {
//	/*BBBB b;
//	b.Print(BBBB::A());
//	int a = 1;
//	test_thinking(a);*/
//	test_BST2();
//	return 0;
//}